﻿using System;
using System.Collections.Generic;
using System.Globalization;

#if SILVERLIGHT
using System.Windows.Media;
#elif XNA
using Microsoft.Xna.Framework;
#endif

namespace RaisingStudio.SmallProgram.Library.Internal
{
    public static class ColorConverter
    {
        private static Dictionary<string, string> namedColors = new Dictionary<string, string>();

        static ColorConverter()
        {
            namedColors.Add("transparent", "#00000000");
            namedColors.Add("indianred", "#CD5C5C");
            namedColors.Add("lightcoral", "#F08080");
            namedColors.Add("salmon", "#FA8072");
            namedColors.Add("darksalmon", "#E9967A");
            namedColors.Add("crimson", "#DC143C");
            namedColors.Add("red", "#FF0000");
            namedColors.Add("firebrick", "#B22222");
            namedColors.Add("darkred", "#8B0000");
            namedColors.Add("pink", "#FFC0CB");
            namedColors.Add("lightpink", "#FFB6C1");
            namedColors.Add("hotpink", "#FF69B4");
            namedColors.Add("deeppink", "#FF1493");
            namedColors.Add("mediumvioletred", "#C71585");
            namedColors.Add("palevioletred", "#DB7093");
            namedColors.Add("lightsalmon", "#FFA07A");
            namedColors.Add("coral", "#FF7F50");
            namedColors.Add("tomato", "#FF6347");
            namedColors.Add("orangered", "#FF4500");
            namedColors.Add("darkorange", "#FF8C00");
            namedColors.Add("orange", "#FFA500");
            namedColors.Add("gold", "#FFD700");
            namedColors.Add("yellow", "#FFFF00");
            namedColors.Add("lightyellow", "#FFFFE0");
            namedColors.Add("lemonchiffon", "#FFFACD");
            namedColors.Add("lightgoldenrodyellow", "#FAFAD2");
            namedColors.Add("papayawhip", "#FFEFD5");
            namedColors.Add("moccasin", "#FFE4B5");
            namedColors.Add("peachpuff", "#FFDAB9");
            namedColors.Add("palegoldenrod", "#EEE8AA");
            namedColors.Add("khaki", "#F0E68C");
            namedColors.Add("darkkhaki", "#BDB76B");
            namedColors.Add("lavender", "#E6E6FA");
            namedColors.Add("thistle", "#D8BFD8");
            namedColors.Add("plum", "#DDA0DD");
            namedColors.Add("violet", "#EE82EE");
            namedColors.Add("orchid", "#DA70D6");
            namedColors.Add("fuchsia", "#FF00FF");
            namedColors.Add("magenta", "#FF00FF");
            namedColors.Add("mediumorchid", "#BA55D3");
            namedColors.Add("mediumpurple", "#9370DB");
            namedColors.Add("blueviolet", "#8A2BE2");
            namedColors.Add("darkviolet", "#9400D3");
            namedColors.Add("darkorchid", "#9932CC");
            namedColors.Add("darkmagenta", "#8B008B");
            namedColors.Add("purple", "#800080");
            namedColors.Add("indigo", "#4B0082");
            namedColors.Add("slateblue", "#6A5ACD");
            namedColors.Add("darkslateblue", "#483D8B");
            namedColors.Add("greenyellow", "#ADFF2F");
            namedColors.Add("chartreuse", "#7FFF00");
            namedColors.Add("lawngreen", "#7CFC00");
            namedColors.Add("lime", "#00FF00");
            namedColors.Add("limegreen", "#32CD32");
            namedColors.Add("palegreen", "#98FB98");
            namedColors.Add("lightgreen", "#90EE90");
            namedColors.Add("mediumspringgreen", "#00FA9A");
            namedColors.Add("springgreen", "#00FF7F");
            namedColors.Add("mediumseagreen", "#3CB371");
            namedColors.Add("seagreen", "#2E8B57");
            namedColors.Add("forestgreen", "#228B22");
            namedColors.Add("green", "#008000");
            namedColors.Add("darkgreen", "#006400");
            namedColors.Add("yellowgreen", "#9ACD32");
            namedColors.Add("olivedrab", "#6B8E23");
            namedColors.Add("olive", "#808000");
            namedColors.Add("darkolivegreen", "#556B2F");
            namedColors.Add("mediumaquamarine", "#66CDAA");
            namedColors.Add("darkseagreen", "#8FBC8F");
            namedColors.Add("lightseagreen", "#20B2AA");
            namedColors.Add("darkcyan", "#008B8B");
            namedColors.Add("teal", "#008080");
            namedColors.Add("aqua", "#00FFFF");
            namedColors.Add("cyan", "#00FFFF");
            namedColors.Add("lightcyan", "#E0FFFF");
            namedColors.Add("paleturquoise", "#AFEEEE");
            namedColors.Add("aquamarine", "#7FFFD4");
            namedColors.Add("turquoise", "#40E0D0");
            namedColors.Add("mediumturquoise", "#48D1CC");
            namedColors.Add("darkturquoise", "#00CED1");
            namedColors.Add("cadetblue", "#5F9EA0");
            namedColors.Add("steelblue", "#4682B4");
            namedColors.Add("lightsteelblue", "#B0C4DE");
            namedColors.Add("powderblue", "#B0E0E6");
            namedColors.Add("lightblue", "#ADD8E6");
            namedColors.Add("skyblue", "#87CEEB");
            namedColors.Add("lightskyblue", "#87CEFA");
            namedColors.Add("deepskyblue", "#00BFFF");
            namedColors.Add("dodgerblue", "#1E90FF");
            namedColors.Add("cornflowerblue", "#6495ED");
            namedColors.Add("mediumslateblue", "#7B68EE");
            namedColors.Add("royalblue", "#4169E1");
            namedColors.Add("blue", "#0000FF");
            namedColors.Add("mediumblue", "#0000CD");
            namedColors.Add("darkblue", "#00008B");
            namedColors.Add("navy", "#000080");
            namedColors.Add("midnightblue", "#191970");
            namedColors.Add("cornsilk", "#FFF8DC");
            namedColors.Add("blanchedalmond", "#FFEBCD");
            namedColors.Add("bisque", "#FFE4C4");
            namedColors.Add("navajowhite", "#FFDEAD");
            namedColors.Add("wheat", "#F5DEB3");
            namedColors.Add("burlywood", "#DEB887");
            namedColors.Add("tan", "#D2B48C");
            namedColors.Add("rosybrown", "#BC8F8F");
            namedColors.Add("sandybrown", "#F4A460");
            namedColors.Add("goldenrod", "#DAA520");
            namedColors.Add("darkgoldenrod", "#B8860B");
            namedColors.Add("peru", "#CD853F");
            namedColors.Add("chocolate", "#D2691E");
            namedColors.Add("saddlebrown", "#8B4513");
            namedColors.Add("sienna", "#A0522D");
            namedColors.Add("brown", "#A52A2A");
            namedColors.Add("maroon", "#800000");
            namedColors.Add("white", "#FFFFFF");
            namedColors.Add("snow", "#FFFAFA");
            namedColors.Add("honeydew", "#F0FFF0");
            namedColors.Add("mintcream", "#F5FFFA");
            namedColors.Add("azure", "#F0FFFF");
            namedColors.Add("aliceblue", "#F0F8FF");
            namedColors.Add("ghostwhite", "#F8F8FF");
            namedColors.Add("whitesmoke", "#F5F5F5");
            namedColors.Add("seashell", "#FFF5EE");
            namedColors.Add("beige", "#F5F5DC");
            namedColors.Add("oldlace", "#FDF5E6");
            namedColors.Add("floralwhite", "#FFFAF0");
            namedColors.Add("ivory", "#FFFFF0");
            namedColors.Add("antiquewhite", "#FAEBD7");
            namedColors.Add("linen", "#FAF0E6");
            namedColors.Add("lavenderblush", "#FFF0F5");
            namedColors.Add("mistyrose", "#FFE4E1");
            namedColors.Add("gainsboro", "#DCDCDC");
            namedColors.Add("lightgray", "#D3D3D3");
            namedColors.Add("silver", "#C0C0C0");
            namedColors.Add("darkgray", "#A9A9A9");
            namedColors.Add("gray", "#808080");
            namedColors.Add("dimgray", "#696969");
            namedColors.Add("lightslategray", "#778899");
            namedColors.Add("slategray", "#708090");
            namedColors.Add("darkslategray", "#2F4F4F");
            namedColors.Add("black", "#000000");
        }

        public static Color GetColor(string color)
        {
            string name;
            if (namedColors.TryGetValue(color.ToLower(CultureInfo.InvariantCulture), out name))
            {
                return GetColor(name);
            }
            if (color.StartsWith("#") && ((color.Length == 7) || (color.Length == 9)))
            {
                int r;
                int g;
                int b;
                int a = 0xff;
                int startIndex = 1;
                if (color.Length == 9)
                {
                    startIndex = 3;
                    if (!int.TryParse(color.Substring(1, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out a))
                    {
#if SILVERLIGHT
                        return Colors.Black;
#else
                        return Color.Black;
#endif
                    }
                }
                if ((int.TryParse(color.Substring(startIndex, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out r) && int.TryParse(color.Substring(startIndex + 2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out g)) && int.TryParse(color.Substring(startIndex + 4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out b))
                {
#if SILVERLIGHT
                    return Color.FromArgb((byte)r, (byte)g, (byte)b, (byte)a);
#else
                    return new Color((byte)r, (byte)g, (byte)b, (byte)a);
#endif
                }
            }
#if SILVERLIGHT
            return Colors.Black;
#else
            return Color.Black;
#endif
        }
    }
}